/*
 * v3_view.h
 * PDMS 3D视图相关结构定义
 */
#ifndef V3_VIEW_H
#define V3_VIEW_H

/*
 * V3_View - 基础视图类
 * 
 * 属性ID参考:
 * 48 - 投影类型 (2=透视, 其他=平行)
 * 49 - 绘制样式 (1=线框, 其他=着色)
 * 55 - 通过点 (3个浮点值)
 * 61 - 范围 (浮点值)
 * 62 - 半径 (浮点值)
 * 61(0x3D) - 近裁剪面
 * 3(0x3700000003) - 中心点
 * 519 - 步长 (整数)
 * 520 - 行走模式 (1=开启, 0=关闭)
 */
struct V3_View {
    void* vftable;         // +0x00 虚函数表，包含mapView函数(+1)等
    int clientData;        // +0x04 客户端数据
    int viewId;            // +0x08 视图ID，用于HGETI1/HPUTI1属性存取
    int drawingHandle;     // +0x0C 绘图句柄，用于SGL_set_clipping_planes等
    int windowHandle;      // +0x10 窗口句柄
    int parentWindow;      // +0x14 父窗口
    int viewFlags;         // +0x18 视图标志
    int renderFlags;       // +0x1C 渲染标志
    short cursorType;      // +0x20 光标类型
    short padding1;        // +0x22 填充字段
    int mouseMode;         // +0x24 鼠标模式(通过setMouseMode设置)
    int mouseButtonState;  // +0x28 鼠标按钮状态
    int buttonHandler;     // +0x2C 按钮处理器
    int mouseEventMask;    // +0x30 鼠标事件掩码
    int keyboardEventMask; // +0x34 键盘事件掩码
    int inputQueue;        // +0x38 输入队列
    int cameraPosition;    // +0x3C 相机位置
    int viewWidth;         // +0x40 视图宽度 (默认200)
    
    // 视图限制和变换
    // 由setLimits函数设置
    double viewMatrix[6];  // +0x44 - +0x7B 视图限制和变换矩阵
                           // [0,1]=x轴最小/最大, [2,3]=y轴最小/最大, [4,5]=z轴最小/最大
    
    // 由setNearFarClippingPlanes函数设置
    float clipXMin;        // +0x7C X轴裁剪最小值
    float clipXMax;        // +0x80 X轴裁剪最大值
    float clipYMin;        // +0x84 Y轴裁剪最小值
    float clipYMax;        // +0x88 Y轴裁剪最大值
    float clipZMin;        // +0x8C Z轴裁剪最小值
    float clipZMax;        // +0x90 Z轴裁剪最大值
}; // 总大小 = 0x94 (148) 字节

/*
 * V3_View3D - 3D视图类，继承自V3_View
 * 
 * 属性ID参考:
 * 64 - 命令行显示 (布尔值)
 * 66 - 标尺显示 (布尔值)
 * 67 - 网格显示 (布尔值)
 * 68 - 主滚轮显示 (布尔值)
 * 69 - Ctrl滚轮显示 (布尔值)
 * 70 - 编辑模式 (布尔值)
 * 117 - LCS轴显示 (布尔值)
 * 118 - LCS名称 (字符串)
 * 151 - LCS部件显示 (布尔值)
 */
struct V3_View3D {
    // 基类部分
    struct V3_View baseView;  // +0x00 - +0x93 基类V3_View的所有成员
    
    // 事件处理相关成员
    int pendingEventStateFlags;   // +0x94 事件状态标志
    int eventHandlerFlags;        // +0x98 事件处理器标志
    void* featureEventState;      // +0x9C V3_FeatureEventState对象指针
    void* viewEventState;         // +0xA0 V3_ViewEventState对象指针
    void* inmodeEventState;       // +0xA4 V3_InmodeEventState对象指针
    void* pendingEventState;      // +0xA8 待处理的事件状态
    int eventReserved;            // +0xAC 事件相关保留字段
    
    // 视图配置属性，由V3_View3D::mapView设置commandLineVisible=1
    bool commandLineVisible;      // +0xB0 命令行显示标志 (属性ID=64)，偏移180字节
    char padding1[3];             // +0xB1 - +0xB3 字节对齐
    int viewState;                // +0xB4 视图状态
    int viewMode;                 // +0xB8 视图模式 (初始化为15)
    bool editMode;                // +0xBC 编辑模式标志 (属性ID=70)，偏移217字节
    char padding2[3];             // +0xBD - +0xBF 字节对齐
    void* observer;               // +0xC0 观察者对象指针(V3_View3DObserver)
    
    // 视图显示属性
    bool gridEnabled;             // +0xC4 网格显示标志 (属性ID=67)
    bool rulersEnabled;           // +0xC5 标尺显示标志 (属性ID=66)
    bool lcsGadgetEnabled;        // +0xC6 LCS部件显示标志 (属性ID=151)
    bool lcsAxisVisible;          // +0xC7 LCS轴显示标志 (属性ID=117)
    bool mainWheelVisible;        // +0xC8 主滚轮显示标志 (属性ID=68)
    bool ctrlWheelVisible;        // +0xC9 Ctrl滚轮显示标志 (属性ID=69)
    char padding3[2];             // +0xCA - +0xCB 字节对齐
    
    // 关联资源
    int attachedDrawlist;         // +0xCC 关联的绘图列表ID
    char* lcsName;                // +0xD0 LCS名称 (属性ID=118)
}; // 总大小 = 0xD4 (212) 字节

#endif /* V3_VIEW_H */



